package com.xinzhitong.www.service;

import com.xinzhitong.www.enumeration.RoleType;
import com.xinzhitong.www.exception.*;
import com.xinzhitong.www.pojo.TempAccount;
import com.xinzhitong.www.pojo.User;
import com.xinzhitong.www.utils.EmailUtils;
import com.xinzhitong.www.utils.SMSUtil;
import org.apache.shiro.authc.AccountException;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 账户服务
 *
 * @author 徐鑫 魏骆淳
 */
public interface UserService {

    /**
     * 登录
     *
     * @param user 用户
     * @throws AccountException 账号异常
     */
    void login(User user) throws AccountException;

    /**
     * 手机登录（暂时废弃）
     *
     * @param phone     手机号码（账号）
     * @param checkCode 校验码
     * @throws AccountException 账号异常
     */
    void login(String phone, String checkCode) throws CheckCodeException, AccountException;

    /**
     * 注册
     *
     * @param user 用户
     * @throws BusyException     繁忙异常
     * @throws RegisterException 注册异常
     */
    void register(User user) throws RegisterException, BusyException;

    /**
     * 手机号注册
     *
     * @param phone     手机号码（账号）
     * @param checkCode 校验码
     * @throws RegisterException  注册异常
     * @throws BusyException      繁忙异常
     * @throws CheckCodeException 验证码异常
     */
    void register(
            String phone,
            String password,
            String checkCode
    ) throws RegisterException, BusyException, CheckCodeException;

    /**
     * 重置密码
     *
     * @param phone     电话号码
     * @param password  密码
     * @param checkCode 验证码
     * @throws BusyException      系统繁忙异常
     * @throws CheckCodeException 验证码异常
     */
    void resetPassword(String phone, String password, String checkCode) throws BusyException, CheckCodeException;

    /**
     * 获取用户报名所需的个人信息
     *
     * @return 报名所需的个人信息
     * @throws PersonalInfoException 个人信息异常
     */
    Map<String, Object> getEnrollInfo() throws PersonalInfoException;

    /**
     * 获取用户主要信息
     *
     * @return 用户主要信息
     * @throws PersonalInfoException 用户信息异常
     */
    Map<String, Object> getMainInfo() throws PersonalInfoException;

    /**
     * 编辑用户信息为新信息
     *
     * @param head    头像
     * @param newInfo 新信息
     * @throws IOException           IO异常
     * @throws PersonalInfoException 用户信息异常
     * @throws BusyException         系统繁忙异常
     */
    void editUserInfo(MultipartFile head, User newInfo) throws IOException, PersonalInfoException, BusyException;




    /**
     * 获取用户主要信息
     *
     * @return 用户主要信息
     * @throws PersonalInfoException 用户信息异常
     */
    Map<String, Object> getMainInfoNew() throws PersonalInfoException;

    /**
     * 编辑用户信息为新信息
     *
     * @param headNum    头像
     * @param newInfo 新信息
     * @throws IOException           IO异常
     * @throws PersonalInfoException 用户信息异常
     * @throws BusyException         系统繁忙异常
     */
    void editUserInfo(Integer headNum, User newInfo) throws IOException, PersonalInfoException, BusyException;


    /**
     * 编辑用户信息为新信息
     *
     * @param head    头像
     * @param newInfo 新信息
     * @throws IOException           IO异常
     * @throws PersonalInfoException 用户信息异常
     * @throws BusyException         系统繁忙异常
     * test
     */
    HashMap<String, Object> editUserInfoTest(Integer head, User newInfo) throws Exception;

    /**
     * 给指定手机号码发送用作特殊用途的验证码
     *
     * @param phone       电话号码
     * @param smsCodeType 验证码类型（登录，注册，找回密码）
     * @throws CheckCodeException 验证码异常
     * @throws PhoneException     电话号码异常
     */
    void sendSMS(String phone, SMSUtil.SMSCodeType smsCodeType) throws CheckCodeException, PhoneException;

    /**
     * 验证并记录实名认证信息
     *
     * @param front    身份证正面
     * @param behind   身份证背面
     * @param realname 真实姓名
     * @param id       身份证号码
     * @throws CertificationException 认证异常
     */
    void recordCertification(
            MultipartFile front,
            MultipartFile behind,
            String realname,
            String id
    ) throws CertificationException;

    /**
     * 判断用户是否认证
     *
     * @return TRUE或者FALSE
     */
    Boolean ifUserAuthentication();

    /**
     * 记录用户上次登录时间
     */
    void recordUsersLastLoginTime();

    /**
     * 确认邮箱信息可注册并发送激活邮件
     *
     * @param tempAccount 临时账户信息
     * @param emailType   邮件类型
     * @param targetType  服务目标类型
     */
    void sendEmail(
            TempAccount tempAccount,
            EmailUtils.EmailType emailType,
            RoleType targetType
    );

    /**
     * 激活邮箱账号
     *
     * @param randomKey 随机密钥
     */
    void activeEmailAccount(String randomKey);

    /**
     * 重置邮箱账号的密码
     *
     * @param randomKey 随机密钥
     */
    void resetEmailAccountPassword(String randomKey);

    /**
     * 使用原密码修改密码
     *
     * @param oldOne 原密码
     * @param newOne 新密码
     */
    void resetPasswordByOldOne(String oldOne, String newOne);

}
